--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tests/frontend/swShellRuntime.oracle.test.js 22b4fcce096023ec706bab5449805e34a2912643 (22b4fcce) Text, 10.15 KB
T8b949e// SPDX-License-Identifier: 0BSD
T8b949e/**
* Runtime strategy oracles: races, leaks, update prune, navigation timeout fallback.
*/
Tff7b72import Tb4b4b4{ Te6edf3afterEachTb4b4b4, Te6edf3describeTb4b4b4, Te6edf3expectTb4b4b4, Te6edf3itTb4b4b4, Te6edf3vi Tb4b4b4} Tff7b72from Ta5d6ff"vitest"Tb4b4b4;
Tff7b72import Tb4b4b4{ Te6edf3cacheNameForBuildTb4b4b4, Te6edf3SHELL_CACHE_PREFIX Tb4b4b4} Tff7b72from Ta5d6ff"../../meshchatx/src/frontend/js/pwa/swCachePolicy.js"Tb4b4b4;
Tff7b72import Tb4b4b4{
Te6edf3createShellRuntimeTb4b4b4,
Te6edf3findForbiddenCachedUrlsTb4b4b4,
Te6edf3oracleExpectedStrategyTb4b4b4,
Te6edf3selectCachesToDeleteTb4b4b4,
Te6edf3SHELL_FALLBACK_URLTb4b4b4,
Tb4b4b4} Tff7b72from Ta5d6ff"../../meshchatx/src/frontend/js/pwa/swShellRuntime.js"Tb4b4b4;
Tff7b72import Tb4b4b4{
Te6edf3decideControllerChangeReloadTb4b4b4,
Te6edf3isIgnorableServiceWorkerRegistrationErrorTb4b4b4,
Te6edf3serviceWorkerRegisterOptionsTb4b4b4,
Tb4b4b4} Tff7b72from Ta5d6ff"../../meshchatx/src/frontend/js/pwa/swClientRegister.js"Tb4b4b4;
Tff7b72import Tb4b4b4{ Te6edf3makeRequestTb4b4b4, Te6edf3MemoryCacheStorageTb4b4b4, Te6edf3okResponse Tb4b4b4} Tff7b72from Ta5d6ff"./helpers/memoryCacheStorage.js"Tb4b4b4;
Tff7b72const Te6edf3ORIGIN Tff7b72= Ta5d6ff"https://127.0.0.1:8000"Tb4b4b4;
Tff7b72function Te6edf3assertNoApiLeakOracleTb4b4b4(Te6edf3cacheStorageTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3leaked Tff7b72= Te6edf3findForbiddenCachedUrlsTb4b4b4(Te6edf3cacheStorageTb4b4b4.Te6edf3allUrlsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3leakedTb4b4b4)Tb4b4b4.Te6edf3toEqualTb4b4b4(Tb4b4b4[Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3describeTb4b4b4(Ta5d6ff"swShellRuntime oracle / race / leak"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3afterEachTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3viTb4b4b4.Te6edf3useRealTimersTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"oracle: cache-first serves cached asset and never stores API"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3caches Tff7b72= Tff7b72new Te6edf3MemoryCacheStorageTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3cacheName Tff7b72= Te6edf3cacheNameForBuildTb4b4b4(Ta5d6ff"t1"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3assetUrl Tff7b72= Ta5d6ff`Tffd700${Te6edf3ORIGINTffd700}Ta5d6ff/assets/app-abc.jsTa5d6ff`Tb4b4b4;
Tff7b72let Te6edf3fetches Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72const Te6edf3fetchFn Tff7b72= Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tff7b72async Tb4b4b4(Te6edf3requestTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3fetches Tff7b72+= T79c0ff1Tb4b4b4;
Tff7b72const Te6edf3url Tff7b72= Tff7b72typeof Te6edf3request Tff7b72=== Ta5d6ff"string" Tff7b72? Te6edf3request Tff7b72: Te6edf3requestTb4b4b4.Te6edf3urlTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3urlTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/api/"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3okResponseTb4b4b4(Ta5d6ff'{"secret":true}'Tb4b4b4, Tb4b4b4{ Te6edf3headersTff7b72: Tb4b4b4{ Ta5d6ff"content-type"Tff7b72: Ta5d6ff"application/json" Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3okResponseTb4b4b4(Ta5d6ff"asset-v1"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3runtime Tff7b72= Te6edf3createShellRuntimeTb4b4b4(Tb4b4b4{
Te6edf3cachesTb4b4b4,
Te6edf3fetchTff7b72: Te6edf3fetchFnTb4b4b4,
Te6edf3cacheNameTb4b4b4,
Te6edf3originTff7b72: Te6edf3ORIGINTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3assetReq Tff7b72= Te6edf3makeRequestTb4b4b4(Te6edf3assetUrlTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3first Tff7b72= Tff7b72await Te6edf3runtimeTb4b4b4.Te6edf3cacheFirstTb4b4b4(Te6edf3assetReqTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tff7b72await Te6edf3firstTb4b4b4.Te6edf3textTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff"asset-v1"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3second Tff7b72= Tff7b72await Te6edf3runtimeTb4b4b4.Te6edf3cacheFirstTb4b4b4(Te6edf3assetReqTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tff7b72await Te6edf3secondTb4b4b4.Te6edf3textTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff"asset-v1"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3fetchesTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3apiReq Tff7b72= Te6edf3makeRequestTb4b4b4(Ta5d6ff`Tffd700${Te6edf3ORIGINTffd700}Ta5d6ff/api/v1/statusTa5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3runtimeTb4b4b4.Te6edf3resolveFetchTb4b4b4(Te6edf3apiReqTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeNullTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3oracleExpectedStrategyTb4b4b4(Tb4b4b4{ Te6edf3pathnameTff7b72: Ta5d6ff"/api/v1/status"Tb4b4b4, Te6edf3methodTff7b72: Ta5d6ff"GET" Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff"bypass"Tb4b4b4)Tb4b4b4;
Te6edf3assertNoApiLeakOracleTb4b4b4(Te6edf3cachesTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"oracle: failed network responses are not written to cache"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3caches Tff7b72= Tff7b72new Te6edf3MemoryCacheStorageTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3cacheName Tff7b72= Te6edf3cacheNameForBuildTb4b4b4(Ta5d6ff"t2"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3assetUrl Tff7b72= Ta5d6ff`Tffd700${Te6edf3ORIGINTffd700}Ta5d6ff/assets/missing.jsTa5d6ff`Tb4b4b4;
Tff7b72const Te6edf3fetchFn Tff7b72= Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tff7b72new Te6edf3ResponseTb4b4b4(Ta5d6ff"nope"Tb4b4b4, Tb4b4b4{ Te6edf3statusTff7b72: T79c0ff404 Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3runtime Tff7b72= Te6edf3createShellRuntimeTb4b4b4(Tb4b4b4{ Te6edf3cachesTb4b4b4, Te6edf3fetchTff7b72: Te6edf3fetchFnTb4b4b4, Te6edf3cacheNameTb4b4b4, Te6edf3originTff7b72: Te6edf3ORIGIN Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Te6edf3runtimeTb4b4b4.Te6edf3cacheFirstTb4b4b4(Te6edf3makeRequestTb4b4b4(Te6edf3assetUrlTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3responseTb4b4b4.Te6edf3statusTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(T79c0ff404Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3cachesTb4b4b4.Te6edf3allUrlsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toEqualTb4b4b4(Tb4b4b4[Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"race: concurrent cache-first misses do not leak and stabilize on one body"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3caches Tff7b72= Tff7b72new Te6edf3MemoryCacheStorageTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3cacheName Tff7b72= Te6edf3cacheNameForBuildTb4b4b4(Ta5d6ff"race"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3assetUrl Tff7b72= Ta5d6ff`Tffd700${Te6edf3ORIGINTffd700}Ta5d6ff/assets/race.jsTa5d6ff`Tb4b4b4;
Tff7b72let Te6edf3started Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72let Te6edf3releaseTb4b4b4;
Tff7b72const Te6edf3gate Tff7b72= Tff7b72new Tffa657PromiseTb4b4b4(Tb4b4b4(Te6edf3resolveTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3release Tff7b72= Te6edf3resolveTb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3fetchFn Tff7b72= Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3started Tff7b72+= T79c0ff1Tb4b4b4;
Tff7b72await Te6edf3gateTb4b4b4;
Tff7b72return Te6edf3okResponseTb4b4b4(Ta5d6ff`Ta5d6ffbody-Tffd700${Te6edf3startedTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3runtime Tff7b72= Te6edf3createShellRuntimeTb4b4b4(Tb4b4b4{ Te6edf3cachesTb4b4b4, Te6edf3fetchTff7b72: Te6edf3fetchFnTb4b4b4, Te6edf3cacheNameTb4b4b4, Te6edf3originTff7b72: Te6edf3ORIGIN Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3req Tff7b72= Te6edf3makeRequestTb4b4b4(Te6edf3assetUrlTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3p1 Tff7b72= Te6edf3runtimeTb4b4b4.Te6edf3cacheFirstTb4b4b4(Te6edf3reqTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3p2 Tff7b72= Te6edf3runtimeTb4b4b4.Te6edf3cacheFirstTb4b4b4(Te6edf3reqTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3viTb4b4b4.Te6edf3waitForTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3startedTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3releaseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Tb4b4b4[Te6edf3r1Tb4b4b4, Te6edf3r2Tb4b4b4] Tff7b72= Tff7b72await Tffa657PromiseTb4b4b4.Te6edf3allTb4b4b4(Tb4b4b4[Te6edf3p1Tb4b4b4, Te6edf3p2Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3t1 Tff7b72= Tff7b72await Te6edf3r1Tb4b4b4.Te6edf3textTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3t2 Tff7b72= Tff7b72await Te6edf3r2Tb4b4b4.Te6edf3textTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3t1Tb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"body-"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3t2Tb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"body-"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3assertNoApiLeakOracleTb4b4b4(Te6edf3cachesTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3cached Tff7b72= Tff7b72await Te6edf3cachesTb4b4b4.Te6edf3matchTb4b4b4(Te6edf3reqTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3cachedTb4b4b4)Tb4b4b4.Te6edf3toBeTruthyTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tb4b4b4(Tff7b72await Te6edf3cachedTb4b4b4.Te6edf3textTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"body-"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"race: prune deletes only old shell caches and keeps current"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3caches Tff7b72= Tff7b72new Te6edf3MemoryCacheStorageTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3oldName Tff7b72= Te6edf3cacheNameForBuildTb4b4b4(Ta5d6ff"old"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3newName Tff7b72= Te6edf3cacheNameForBuildTb4b4b4(Ta5d6ff"new"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3oldCache Tff7b72= Tff7b72await Te6edf3cachesTb4b4b4.Te6edf3openTb4b4b4(Te6edf3oldNameTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3newCache Tff7b72= Tff7b72await Te6edf3cachesTb4b4b4.Te6edf3openTb4b4b4(Te6edf3newNameTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3oldCacheTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff`Tffd700${Te6edf3ORIGINTffd700}Ta5d6ff/assets/old.jsTa5d6ff`Tb4b4b4, Te6edf3okResponseTb4b4b4(Ta5d6ff"old"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3newCacheTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff`Tffd700${Te6edf3ORIGINTffd700}Ta5d6ff/assets/new.jsTa5d6ff`Tb4b4b4, Te6edf3okResponseTb4b4b4(Ta5d6ff"new"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3cachesTb4b4b4.Te6edf3openTb4b4b4(Ta5d6ff"unrelated-other"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3doomed Tff7b72= Te6edf3selectCachesToDeleteTb4b4b4(Tff7b72await Te6edf3cachesTb4b4b4.Te6edf3keysTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3SHELL_CACHE_PREFIXTb4b4b4, Te6edf3newNameTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3doomedTb4b4b4)Tb4b4b4.Te6edf3toEqualTb4b4b4(Tb4b4b4[Te6edf3oldNameTb4b4b4]Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3runtime Tff7b72= Te6edf3createShellRuntimeTb4b4b4(Tb4b4b4{
Te6edf3cachesTb4b4b4,
Te6edf3fetchTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3cacheNameTff7b72: Te6edf3newNameTb4b4b4,
Te6edf3originTff7b72: Te6edf3ORIGINTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3deleted Tff7b72= Tff7b72await Te6edf3runtimeTb4b4b4.Te6edf3pruneOldShellCachesTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3deletedTb4b4b4)Tb4b4b4.Te6edf3toEqualTb4b4b4(Tb4b4b4[Te6edf3oldNameTb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tff7b72await Te6edf3cachesTb4b4b4.Te6edf3keysTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toEqualTb4b4b4(Te6edf3expectTb4b4b4.Te6edf3arrayContainingTb4b4b4(Tb4b4b4[Te6edf3newNameTb4b4b4, Ta5d6ff"unrelated-other"Tb4b4b4]Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tff7b72await Te6edf3cachesTb4b4b4.Te6edf3keysTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Te6edf3oldNameTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tff7b72await Tb4b4b4(Tff7b72await Te6edf3cachesTb4b4b4.Te6edf3openTb4b4b4(Te6edf3newNameTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3matchTb4b4b4(Ta5d6ff`Tffd700${Te6edf3ORIGINTffd700}Ta5d6ff/assets/new.jsTa5d6ff`Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTruthyTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"edge: navigation timeout falls back to cached shell without caching API"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3viTb4b4b4.Te6edf3useFakeTimersTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3caches Tff7b72= Tff7b72new Te6edf3MemoryCacheStorageTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3cacheName Tff7b72= Te6edf3cacheNameForBuildTb4b4b4(Ta5d6ff"nav"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3shell Tff7b72= Te6edf3okResponseTb4b4b4(Ta5d6ff"<html>shell</html>"Tb4b4b4, Tb4b4b4{ Te6edf3headersTff7b72: Tb4b4b4{ Ta5d6ff"content-type"Tff7b72: Ta5d6ff"text/html" Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Tb4b4b4(Tff7b72await Te6edf3cachesTb4b4b4.Te6edf3openTb4b4b4(Te6edf3cacheNameTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3putTb4b4b4(Te6edf3SHELL_FALLBACK_URLTb4b4b4, Te6edf3shellTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3fetchFn Tff7b72= Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4(Te6edf3_requestTb4b4b4, Te6edf3init Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72return Tff7b72new Tffa657PromiseTb4b4b4(Tb4b4b4(Te6edf3resolveTb4b4b4, Te6edf3rejectTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3initTb4b4b4.Te6edf3signalTb4b4b4) Tb4b4b4{
Te6edf3initTb4b4b4.Te6edf3signalTb4b4b4.Te6edf3addEventListenerTb4b4b4(Ta5d6ff"abort"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3rejectTb4b4b4(Tff7b72new Te6edf3DOMExceptionTb4b4b4(Ta5d6ff"Aborted"Tb4b4b4, Ta5d6ff"AbortError"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3runtime Tff7b72= Te6edf3createShellRuntimeTb4b4b4(Tb4b4b4{
Te6edf3cachesTb4b4b4,
Te6edf3fetchTff7b72: Te6edf3fetchFnTb4b4b4,
Te6edf3cacheNameTb4b4b4,
Te6edf3originTff7b72: Te6edf3ORIGINTb4b4b4,
Te6edf3navTimeoutMsTff7b72: T79c0ff50Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3navReq Tff7b72= Te6edf3makeRequestTb4b4b4(Ta5d6ff`Tffd700${Te6edf3ORIGINTffd700}Ta5d6ff/Ta5d6ff`Tb4b4b4, Tb4b4b4{ Te6edf3modeTff7b72: Ta5d6ff"navigate" Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3pending Tff7b72= Te6edf3runtimeTb4b4b4.Te6edf3networkFirstNavigationTb4b4b4(Tb4b4b4{ Te6edf3requestTff7b72: Te6edf3navReq Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3viTb4b4b4.Te6edf3advanceTimersByTimeAsyncTb4b4b4(T79c0ff60Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Te6edf3pendingTb4b4b4;
Te6edf3expectTb4b4b4(Tff7b72await Te6edf3responseTb4b4b4.Te6edf3textTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"shell"Tb4b4b4)Tb4b4b4;
Te6edf3assertNoApiLeakOracleTb4b4b4(Te6edf3cachesTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"edge: cross-origin and network-only paths bypass respondWith"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3caches Tff7b72= Tff7b72new Te6edf3MemoryCacheStorageTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3runtime Tff7b72= Te6edf3createShellRuntimeTb4b4b4(Tb4b4b4{
Te6edf3cachesTb4b4b4,
Te6edf3fetchTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3cacheNameTff7b72: Te6edf3cacheNameForBuildTb4b4b4(Ta5d6ff"x"Tb4b4b4)Tb4b4b4,
Te6edf3originTff7b72: Te6edf3ORIGINTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3runtimeTb4b4b4.Te6edf3resolveFetchTb4b4b4(Te6edf3makeRequestTb4b4b4(Ta5d6ff"https://evil.example/assets/x.js"Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeNullTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3runtimeTb4b4b4.Te6edf3resolveFetchTb4b4b4(Te6edf3makeRequestTb4b4b4(Ta5d6ff`Tffd700${Te6edf3ORIGINTffd700}Ta5d6ff/vendor/x.wasmTa5d6ff`Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeNullTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3runtimeTb4b4b4.Te6edf3resolveFetchTb4b4b4(Te6edf3makeRequestTb4b4b4(Ta5d6ff`Tffd700${Te6edf3ORIGINTffd700}Ta5d6ff/api/v1/statusTa5d6ff`Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeNullTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3runtimeTb4b4b4.Te6edf3resolveFetchTb4b4b4(Te6edf3makeRequestTb4b4b4(Ta5d6ff`Tffd700${Te6edf3ORIGINTffd700}Ta5d6ff/wsTa5d6ff`Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeNullTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"edge: stale-while-revalidate returns cache immediately then refreshes"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3caches Tff7b72= Tff7b72new Te6edf3MemoryCacheStorageTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3cacheName Tff7b72= Te6edf3cacheNameForBuildTb4b4b4(Ta5d6ff"swr"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3url Tff7b72= Ta5d6ff`Tffd700${Te6edf3ORIGINTffd700}Ta5d6ff/boot-theme.jsTa5d6ff`Tb4b4b4;
Tff7b72await Tb4b4b4(Tff7b72await Te6edf3cachesTb4b4b4.Te6edf3openTb4b4b4(Te6edf3cacheNameTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3putTb4b4b4(Te6edf3urlTb4b4b4, Te6edf3okResponseTb4b4b4(Ta5d6ff"old-theme"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72let Te6edf3resolveNetTb4b4b4;
Tff7b72const Te6edf3net Tff7b72= Tff7b72new Tffa657PromiseTb4b4b4(Tb4b4b4(Te6edf3resolveTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3resolveNet Tff7b72= Te6edf3resolveTb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3fetchFn Tff7b72= Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3netTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3runtime Tff7b72= Te6edf3createShellRuntimeTb4b4b4(Tb4b4b4{ Te6edf3cachesTb4b4b4, Te6edf3fetchTff7b72: Te6edf3fetchFnTb4b4b4, Te6edf3cacheNameTb4b4b4, Te6edf3originTff7b72: Te6edf3ORIGIN Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3first Tff7b72= Tff7b72await Te6edf3runtimeTb4b4b4.Te6edf3staleWhileRevalidateTb4b4b4(Te6edf3makeRequestTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tff7b72await Te6edf3firstTb4b4b4.Te6edf3textTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff"old-theme"Tb4b4b4)Tb4b4b4;
Te6edf3resolveNetTb4b4b4(Te6edf3okResponseTb4b4b4(Ta5d6ff"new-theme"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3viTb4b4b4.Te6edf3waitForTb4b4b4(Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3cached Tff7b72= Tff7b72await Tb4b4b4(Tff7b72await Te6edf3cachesTb4b4b4.Te6edf3openTb4b4b4(Te6edf3cacheNameTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3matchTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tff7b72await Te6edf3cachedTb4b4b4.Te6edf3textTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff"new-theme"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"leak oracle: findForbiddenCachedUrls catches api and ws entries"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(
Te6edf3findForbiddenCachedUrlsTb4b4b4(Tb4b4b4[
Ta5d6ff`Tffd700${Te6edf3ORIGINTffd700}Ta5d6ff/assets/a.jsTa5d6ff`Tb4b4b4,
Ta5d6ff`Tffd700${Te6edf3ORIGINTffd700}Ta5d6ff/api/v1/statusTa5d6ff`Tb4b4b4,
Ta5d6ff`Tffd700${Te6edf3ORIGINTffd700}Ta5d6ff/wsTa5d6ff`Tb4b4b4,
Ta5d6ff"/boot-theme.js"Tb4b4b4,
Tb4b4b4]Tb4b4b4)
Tb4b4b4)Tb4b4b4.Te6edf3toEqualTb4b4b4(Tb4b4b4[Ta5d6ff"/api/v1/status"Tb4b4b4, Ta5d6ff"/ws"Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3describeTb4b4b4(Ta5d6ff"swClientRegister update lifecycle oracle"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3itTb4b4b4(Ta5d6ff"oracle: first install does not reload, update reloads once"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3decideControllerChangeReloadTb4b4b4(Tb4b4b4{ Te6edf3hadControllerTff7b72: Tff7b72falseTb4b4b4, Te6edf3refreshingTff7b72: Tff7b72false Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toEqualTb4b4b4(Tb4b4b4{
Te6edf3shouldReloadTff7b72: Tff7b72falseTb4b4b4,
Te6edf3nextRefreshingTff7b72: Tff7b72falseTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3first Tff7b72= Te6edf3decideControllerChangeReloadTb4b4b4(Tb4b4b4{ Te6edf3hadControllerTff7b72: Tff7b72trueTb4b4b4, Te6edf3refreshingTff7b72: Tff7b72false Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3firstTb4b4b4)Tb4b4b4.Te6edf3toEqualTb4b4b4(Tb4b4b4{ Te6edf3shouldReloadTff7b72: Tff7b72trueTb4b4b4, Te6edf3nextRefreshingTff7b72: Tff7b72true Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3decideControllerChangeReloadTb4b4b4(Tb4b4b4{ Te6edf3hadControllerTff7b72: Tff7b72trueTb4b4b4, Te6edf3refreshingTff7b72: Tff7b72true Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toEqualTb4b4b4(Tb4b4b4{
Te6edf3shouldReloadTff7b72: Tff7b72falseTb4b4b4,
Te6edf3nextRefreshingTff7b72: Tff7b72trueTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"oracle: certificate errors are ignorable, others are not"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3isIgnorableServiceWorkerRegistrationErrorTb4b4b4(Tb4b4b4{ Te6edf3nameTff7b72: Ta5d6ff"SecurityError"Tb4b4b4, Te6edf3messageTff7b72: Ta5d6ff"x" Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(
Te6edf3isIgnorableServiceWorkerRegistrationErrorTb4b4b4(Tb4b4b4{ Te6edf3nameTff7b72: Ta5d6ff"TypeError"Tb4b4b4, Te6edf3messageTff7b72: Ta5d6ff"SSL certificate problem" Tb4b4b4}Tb4b4b4)
Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3isIgnorableServiceWorkerRegistrationErrorTb4b4b4(Tb4b4b4{ Te6edf3nameTff7b72: Ta5d6ff"TypeError"Tb4b4b4, Te6edf3messageTff7b72: Ta5d6ff"network down" Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"oracle: register options force updateViaCache none"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3serviceWorkerRegisterOptionsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toEqualTb4b4b4(Tb4b4b4{ Te6edf3updateViaCacheTff7b72: Ta5d6ff"none" Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────